// import 'dart:async';
//
// import 'package:agora_rtc_engine/agora_rtc_engine.dart';
// import 'package:chat_app_project/const/sys_const.dart';
// import 'package:chat_app_project/models/const.dart' as c;
// import 'package:chat_app_project/tool/time.dart';
// import 'package:chat_app_project/util/toast_util.dart';
// import 'package:flutter/material.dart';
// import 'package:wukongimfluttersdk/type/const.dart';
// import 'package:wukongimfluttersdk/wkim.dart';
//
// import '../../components/rounded_button.dart';
// import '../../config/agora_config.dart';
// import '../../dao/im_dao.dart';
// import '../../size_config.dart';
// import '../../util/permission_util.dart';
//
// class CallPage extends StatefulWidget {
//   String channelId;
//   int channelType;
//   String roomId;
//   CallStatusEnum callStatus;
//
//   CallPage(
//       {super.key,
//       required this.channelId,
//       required this.channelType,
//       required this.roomId,
//       required this.callStatus});
//
//   @override
//   _CallPageState createState() => _CallPageState();
// }
//
// enum CallStatusEnum {
//   none,
//   waiting,
//   calling,
//   refused,
//   communicate,
// }
//
// class _CallPageState extends State<CallPage> {
//   int _callDuration = 0;
//   late CallStatusEnum _callStatus = widget.callStatus;
//   Timer? _timer;
//
//   //通话时间计算
//   void _computeTime() {
//     // 模拟通话过程，这里使用定时器模拟通话时长
//     _timer = Timer(const Duration(seconds: 1), () {
//       _callDuration++;
//     });
//     setState(() {});
//   }
//
//   late final RtcEngine _engine;
//   bool
//       // 麦克风  打开麦克风
//       openMicrophone = true,
//       // 扬声器  打开扬声器
//       enableSpeakerphone = true,
//       //播放效果
//       playEffect = false;
//
//   // 耳返
//   bool _enableInEarMonitoring = false;
//   double _recordingVolume = 100,
//       _playbackVolume = 100,
//       _inEarMonitoringVolume = 100;
//   ChannelProfileType _channelProfileType =
//       ChannelProfileType.channelProfileLiveBroadcasting;
//   late final RtcEngineEventHandler _rtcEngineEventHandler;
//
//   @override
//   void initState() {
//     c.UserInfo.setCallable(false);
//     super.initState();
//     _callListener();
//     PermissionUtil.requestMicrophonePermission().then((value) async {
//       if (value) {
//         await _initEngine();
//         //发起者自动进入房间
//         if (_callStatus == CallStatusEnum.calling) {
//           await _joinChannel();
//         }
//       } else {
//         //被邀请者拒绝权限
//         ToastUtil.toast("请先授权");
//         //拒绝通话
//         _callRefused();
//         Navigator.pop(context);
//       }
//     });
//   }
//
//   @override
//   void dispose() {
//     super.dispose();
//     _engine.unregisterEventHandler(_rtcEngineEventHandler);
//     WKIM.shared.cmdManager.removeCmdListener("chat_call");
//     c.UserInfo.setCallable(true);
//   }
//
//   //初始化引擎
//   Future<void> _initEngine() async {
//     _engine = createAgoraRtcEngine();
//     await _engine.initialize(const RtcEngineContext(
//       appId: AgoraConfig.appId,
//     ));
//     _rtcEngineEventHandler = RtcEngineEventHandler(
//       onError: (ErrorCodeType err, String msg) {
//         debugPrint('[onError] err: $err, msg: $msg');
//       },
//       onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
//         debugPrint(
//             '[onJoinChannelSuccess] connection: ${connection.toJson()} elapsed: $elapsed');
//         setState(() {
//           if (_agoraUidCompareTo(connection.localUid)) {
//             if(_callStatus == CallStatusEnum.calling){
//               //发送邀请消息
//               _callInvite();
//             }else if(_callStatus == CallStatusEnum.communicate){
//               //发送已加入消息
//               _callJoin();
//             }
//           }
//           debugPrint("进入 ======================= ${connection.localUid} ${ _getAgoraUid()} ${widget.roomId}");
//         });
//       },
//       onLeaveChannel: (RtcConnection connection, RtcStats stats) {
//         debugPrint(
//             '[onLeaveChannel] connection: ${connection.toJson()} stats: ${stats.toJson()}');
//         setState(() {
//           //对方离开 退出通话
//           if (_agoraUidCompareTo(connection.localUid)) {
//             _callLeave();
//           }
//           debugPrint("离开 =======================  ${connection.localUid} ${ _getAgoraUid()} ${widget.roomId}");
//         });
//       },
//     );
//     _engine.registerEventHandler(_rtcEngineEventHandler);
//     await _engine.enableAudio();
//     await _engine.setClientRole(role: ClientRoleType.clientRoleBroadcaster);
//     await _engine.setAudioProfile(
//       profile: AudioProfileType.audioProfileDefault,
//       scenario: AudioScenarioType.audioScenarioGameStreaming,
//     );
//   }
//
//   //声网id 支持32bit
//   _getAgoraUid() {
//     return int.parse(c.UserInfo.uid.toString().substring(11));
//   }
//
//   _agoraUidCompareTo(agoraUid) {
//     return _getAgoraUid() == agoraUid;
//   }
//
//   //加入频道
//   _joinChannel() async {
//     var res = await ImDao.getRtcToken({"channelName": widget.roomId});
//     var tokenStr = res.data;
//     await _engine.joinChannel(
//         // token: "007eJxTYIjc7JX6Qd/n01Wj7ldr9P7sZzBqU/+TFdQSLPA1NP/rjwoFhuSkRHNLoyQzS1NzcxPTNPPEJHOzNHPjxJQkEzODVGND3VuFqQ2BjAx2tZxMjAwQCOIzMxgaGTMwAAB07R62",
//         token: tokenStr,
//         channelId: widget.roomId,
//         uid: _getAgoraUid(),
//         options: ChannelMediaOptions(
//           channelProfile: _channelProfileType,
//           clientRoleType: ClientRoleType.clientRoleBroadcaster,
//         ));
//   }
//
//   //离开频道
//   _leaveChannel() async {
//     await _engine.leaveChannel();
//     await _engine.release();
//     if (_timer != null) {
//       _timer?.cancel();
//     }
//     _callStatus = CallStatusEnum.none;
//     openMicrophone = true;
//     enableSpeakerphone = true;
//     playEffect = false;
//     _enableInEarMonitoring = false;
//     _recordingVolume = 100;
//     _playbackVolume = 100;
//     _inEarMonitoringVolume = 100;
//   }
//
//   _switchMicrophone() async {
//     // await await _engine.muteLocalAudioStream(!openMicrophone);
//     await _engine.enableLocalAudio(!openMicrophone);
//     setState(() {
//       openMicrophone = !openMicrophone;
//     });
//   }
//
//   _switchSpeakerphone() async {
//     await _engine.setEnableSpeakerphone(!enableSpeakerphone);
//     setState(() {
//       enableSpeakerphone = !enableSpeakerphone;
//     });
//   }
//
//   _switchEffect() async {
//     if (playEffect) {
//       await _engine.stopEffect(1);
//       setState(() {
//         playEffect = false;
//       });
//     } else {
//       final path =
//           (await _engine.getAssetAbsolutePath("assets/Sound_Horizon.mp3"))!;
//       await _engine.playEffect(
//           soundId: 1,
//           filePath: path,
//           loopCount: 0,
//           pitch: 1,
//           pan: 1,
//           gain: 100,
//           publish: true);
//       // .then((value) {
//       setState(() {
//         playEffect = true;
//       });
//     }
//   }
//
//   _onChangeInEarMonitoringVolume(double value) async {
//     _inEarMonitoringVolume = value;
//     await _engine.setInEarMonitoringVolume(_inEarMonitoringVolume.toInt());
//     setState(() {});
//   }
//
//   _toggleInEarMonitoring(value) async {
//     try {
//       await _engine.enableInEarMonitoring(
//           enabled: value,
//           includeAudioFilters: EarMonitoringFilterType.earMonitoringFilterNone);
//       _enableInEarMonitoring = value;
//       setState(() {});
//     } catch (e) {
//       // Do nothing
//     }
//   }
//
//   Future<void> _callListener() async {
//     //  监听获取cmd信息
//     WKIM.shared.cmdManager.addOnCmdListener("chat_call", (cmd) {
//       debugPrint("监听获取cmd信息 chat_call ================ ${cmd.cmd}");
//       //语音拒绝
//       if (cmd.cmd == SysConst.wk_cmd_voice_refuse) {
//         ToastUtil.toast("对方拒绝了你的邀请");
//         _leaveChannel().then((value) {
//           Navigator.pop(context);
//         });
//       }
//       //语音取消
//       if (cmd.cmd == SysConst.wk_cmd_voice_cancel) {
//         ToastUtil.toast("对方已取消");
//         _leaveChannel().then((value) {
//           Navigator.pop(context);
//         });
//       }
//       //语音离开
//       if (cmd.cmd == SysConst.wk_cmd_voice_leave) {
//         ToastUtil.toast("通话已结束");
//         _leaveChannel().then((value) {
//           Navigator.pop(context);
//         });
//       }
//       //语音加入
//       if (cmd.cmd == SysConst.wk_cmd_voice_join) {
//         setState(() {
//           _callStatus = CallStatusEnum.communicate;
//         });
//       }
//     });
//   }
//
//   //先加入变为通话中 再给对面发消息  加入通话
//   void _callJoin() {
//     if (_callStatus == CallStatusEnum.communicate) {
//       //退出
//       Map<String, dynamic> cmd = {};
//       cmd["cmd"] = SysConst.wk_cmd_voice_join;
//       cmd["param"] = {
//         "room_id": widget.roomId,
//         "channel_id": c.UserInfo.uid,
//         "channel_type": WKChannelType.personal
//       };
//       ImDao.sendCmd(widget.channelId, widget.channelType, cmd);
//     }
//   }
//   //退出通话
//   void _callLeave() {
//     if (_callStatus == CallStatusEnum.communicate) {
//       //退出
//       Map<String, dynamic> cmd = {};
//       cmd["cmd"] = SysConst.wk_cmd_voice_leave;
//       cmd["param"] = {
//         "room_id": widget.roomId,
//         "channel_id": c.UserInfo.uid,
//         "channel_type": WKChannelType.personal
//       };
//       ImDao.sendCmd(widget.channelId, widget.channelType, cmd);
//     }
//   }
//   //邀请加入
//   void _callInvite() {
//     if (_callStatus == CallStatusEnum.calling) {
//       //发送消息邀请加入的消息
//       Map<String, dynamic> cmd = {};
//       cmd["cmd"] = SysConst.wk_cmd_voice_invite;
//       cmd["param"] = {
//         "room_id": widget.roomId,
//         "channel_id": c.UserInfo.uid,
//         "channel_type": WKChannelType.personal
//       };
//       ImDao.sendCmd(widget.channelId, widget.channelType, cmd);
//     }
//   }
//
//   //拒绝接听
//   void _callRefused() {
//     if (_callStatus == CallStatusEnum.waiting) {
//       //拒绝接听的消息
//       Map<String, dynamic> cmd = {};
//       cmd["cmd"] = SysConst.wk_cmd_voice_refuse;
//       cmd["param"] = {
//         "room_id": widget.roomId,
//         "channel_id": c.UserInfo.uid,
//         "channel_type": WKChannelType.personal
//       };
//       ImDao.sendCmd(widget.channelId, widget.channelType, cmd);
//     }
//   }
//
//   //取消邀请
//   void _callCancel() {
//     //拒绝接听的消息
//     Map<String, dynamic> cmd = {};
//     cmd["cmd"] = SysConst.wk_cmd_voice_cancel;
//     cmd["param"] = {
//       "room_id": widget.roomId,
//       "channel_id": c.UserInfo.uid,
//       "channel_type": WKChannelType.personal
//     };
//     ImDao.sendCmd(widget.channelId, widget.channelType, cmd);
//   }
//
//   @override
//   Widget build(BuildContext context) {
//     //页面配置初始化
//     SizeConfig().init(context);
//     return Scaffold(
//       body: Stack(
//         fit: StackFit.expand,
//         children: [
//           // Image
//           Image.asset(
//             "assets/images/full_image.png",
//             fit: BoxFit.cover,
//           ),
//           // Black Layer
//           DecoratedBox(
//             decoration: BoxDecoration(color: Colors.black.withOpacity(0.3)),
//           ),
//           Padding(
//             padding: const EdgeInsets.all(20.0),
//             child: SafeArea(
//               child: Column(
//                 crossAxisAlignment: CrossAxisAlignment.start,
//                 children: [
//                   Text(
//                     "Jemmy \nWilliams",
//                     style: Theme.of(context)
//                         .textTheme
//                         .displaySmall
//                         ?.copyWith(color: Colors.white),
//                   ),
//                   const VerticalSpacing(of: 10),
//                   Text(
//                     "通话中 ${TimeUtils.getHMmmss_Seconds(_callDuration)}"
//                         .toUpperCase(),
//                     style: TextStyle(
//                       color: Colors.white.withOpacity(0.6),
//                     ),
//                   ),
//                   const Spacer(
//                     flex: 2,
//                   ),
//                   _callStatus == CallStatusEnum.calling
//                       ? Expanded(
//                           flex: 1,
//                           child: Row(
//                             mainAxisAlignment: MainAxisAlignment.spaceEvenly,
//                             children: [
//                               RoundedButton(
//                                 press: () {
//                                   //取消邀请
//                                   _callCancel();
//                                   _leaveChannel().then((value) {
//                                     Navigator.pop(context);
//                                   });
//                                 },
//                                 color: const Color(0xFFFF1E46),
//                                 iconColor: Colors.white,
//                                 iconSrc: "assets/icons/call_end.svg",
//                               ),
//                             ],
//                           ),
//                         )
//                       : Container(),
//                   _callStatus == CallStatusEnum.communicate
//                       ? Expanded(
//                           flex: 1,
//                           child: Row(
//                             mainAxisAlignment: MainAxisAlignment.spaceEvenly,
//                             children: [
//                               RoundedButton(
//                                 press: () {},
//                                 iconSrc: "assets/icons/icon_mic.svg",
//                               ),
//                               RoundedButton(
//                                 press: () {
//                                   //离开退出
//                                   _leaveChannel();
//                                 },
//                                 color: const Color(0xFFFF1E46),
//                                 iconColor: Colors.white,
//                                 iconSrc: "assets/icons/call_end.svg",
//                               ),
//                               RoundedButton(
//                                 press: () {},
//                                 iconSrc: "assets/icons/icon_volume.svg",
//                               ),
//                             ],
//                           ),
//                         )
//                       : Container(),
//                   _callStatus == CallStatusEnum.waiting
//                       ? Expanded(
//                           flex: 1,
//                           child: Row(
//                             mainAxisAlignment: MainAxisAlignment.spaceEvenly,
//                             children: [
//                               RoundedButton(
//                                 press: () {
//                                   _callRefused();
//                                   Navigator.pop(context);
//                                 },
//                                 color: const Color(0xFFFF1E46),
//                                 iconColor: Colors.white,
//                                 iconSrc: "assets/icons/call_end.svg",
//                               ),
//                               Container(),
//                               RoundedButton(
//                                 press: ()   {
//                                   _joinChannel();
//                                   setState(() {
//                                     _callStatus = CallStatusEnum.communicate;
//                                   });
//                                 },
//                                 color: Colors.green,
//                                 iconColor: Colors.white,
//                                 iconSrc: "assets/icons/call.svg",
//                               ),
//                             ],
//                           ),
//                         )
//                       : Container(),
//                 ],
//               ),
//             ),
//           ),
//         ],
//       ),
//     );
//   }
// }
